--- title: "日期差值" created: 2025-11-28 tags: - 算法 --- # 日期差值 ## 题目 [日期差值](https://www.acwing.com/problem/content/3501/) ![[image-3d1b5e27.png]] ## 思路分析 可以直接按之前的思路 从一段长度里面找合法日期数量 累加一下就是相差的天数 但是对于这里来说 时间效率太低了 会超时 ```cpp #include using namespace std; int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int Start,End; bool check_date(int year,int month,int day) { if(month==0 || month>12) return false; if(day==0 || day>31) return false; int curdays=days[month]; if(month==2) if(year%100 && year%4==0 || year%400==0) curdays++; if(day>curdays) return false; return true; } int main() { while(cin>>Start>>End){ if(Start>End) swap(Start,End); int cnt=0; for(int date=Start;date<=End;date++){ int year=date/10000,month=date%10000/100,day=date%100; if(check_date(year,month,day)){ cnt++; } } cout< using namespace std; int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 计算从公元1年1月1日到指定日期的总天数 int daysFromStart(int year, int month, int day) { int totalDays = 0; // 添加之前年份的天数 for(int y = 1; y < year; y++) { totalDays += isLeapYear(y) ? 366 : 365; } // 添加当前年份的月份天数 for(int m = 1; m < month; m++) { totalDays += days[m]; if(m == 2 && isLeapYear(year)) { totalDays++; } } // 添加当前月份的天数 totalDays += day; return totalDays; } int main() { int startDate, endDate; while(cin >> startDate >> endDate) { if(startDate>endDate) swap(startDate,endDate); int startYear=startDate/10000,startMonth=startDate%10000/100,startDay=startDate%100; int endYear=endDate/10000,endMonth=endDate%10000/100,endDay=endDate%100; int dateDiff=daysFromStart(endYear,endMonth,endDay) - daysFromStart(startYear,startMonth,startDay) + 1; cout << dateDiff << endl; } return 0; } //读入可以写成 /* while (~scanf("%04d%02d%02d\n%04d%02d%02d", &y1, &m1, &d1, &y2, &m2, &d2)) printf("%d\n", abs(daysFromStart(y1, m1, d1) - daysFromStart(y2, m2, d2)) + 1); */ ``` ## 同类题型 ## 视频讲解 --- ⬅️ [[回文日期2|回文日期2]] 🏠 [[00-刷题理模型]] ➡️ [[日期计算|日期计算]]